from .models import WordEntry

# Predefinição:gramática
HEAD_LINE_TAGS = {
    "masculino": "masculine",
    "feminino": "feminine",
    "género comum": "common",
    "dois géneros": "dual",
    "comum aos dois géneros": ["common", "dual"],
    # Predefinição:gramática/core
    # {{int:}} not implemented
    "comum aos dois gêneros": ["common", "dual"],
    "neutro": "neutral",
    "masculino plural": ["masculine", "plural"],
    "masculino singular": ["masculine", "singular"],
    "masculino de dois números": "masculine",
    "masculino comum aos dois números": ["masculine", "common"],
    "masculino invariável": ["masculine", "invariable"],
    "masculino dual": ["masculine", "dual"],
    "feminino plural": ["feminine", "plural"],
    "feminino singular": ["feminine", "singular"],
    "feminino de dois números": "feminine",
    "feminino comum aos dois números": ["feminine", "common"],
    "feminino invariável": ["feminine", "invariable"],
    "feminino dual": ["feminine", "dual"],
    "género comum e plural": ["common", "plural"],
    "género comum e singular": ["common", "singular"],
    "género comum e comum aos dois números": "common",
    "dois géneros plural": "plural",
    "dois géneros singular": "singular",
    "comum aos dois géneros plural": ["common", "plural"],
    "comum aos dois géneros singular": ["common", "singular"],
    "comum aos dois géneros e aos dois números": "common",
    "comum aos dois gêneros plural": ["common", "plural"],
    "comum aos dois gêneros singular": ["common", "singular"],
    "comum aos dois gêneros e aos dois números": "common",
    "neutro plural": ["neutral", "plural"],
    "neutro singular": ["neutral", "singular"],
    "neutro de dois números": "neutral",
    "neutro comum aos dois números": ["neutral", "common"],
    "neutro invariável": ["neutral", "invariable"],
    "neutro dual": ["neutral", "dual"],
    "plural": "plural",
    "singular": "singular",
    "sem plural": "no-plural",
    "singular e plural": ["singular", "plural"],
    # "dois números": "",
    "comum aos dois números": "common",
    "dual": "dual",
    "invariável": "invariable",
    # "uniforme": "",
    # "biforme": "",
    "contável": "countable",
    "incontável": "uncountable",
    "primeira pessoa": "first-person",
    "primeira pessoa do singular": ["first-person", "singular"],
    "primeira pessoa do plural": ["first-person", "plural"],
    "segunda pessoa": "second-person",
    "segunda pessoa do singula": ["second-person", "singular"],
    "segunda pessoa do plural": ["second-person", "plural"],
    "terceira pessoa": "third-person",
    "terceira pessoa do singular": ["third-person", "singular"],
    "terceira pessoa do plural": ["third-person", "plural"],
    "cardinal": "cardinal",
    "ordinal": "ordinal",
    "multiplicativo": "multiplicative",
    # "fracionário": "",
    "distributivo": "distributive",
    "coletivo": "collective",
    "pessoal": "personal",
    "demonstrativo": "demonstrative",
    "possessivo": "possessive",
    "relativo": "relative",
    "interrogativo": "interrogative",
    # "tratamento": "",
    "indefinido": "indefinite",
    "definido": "definite",
    # "próprio": "",
    "comum": "common",
    "concreto": "concrete",
    "abstrato": "abstract",
    "composto": "compound",
    # "simples": "",
    # "primitivo": "",
    # "derivado": "",
    "animado": "animate",
    "inanimado": "inanimate",
    "intransitivo": "intransitive",
    "transitivo": "transitive",
    "transitivo indireto": ["indirect", "transitive"],
    "transitivo direto": ["direct", "transitive"],
    "transitivo direto e indireto": ["direct", "indirect", "transitive"],
    "pronominal": "pronominal",
    "pronominal transitivo indireto": ["pronominal", "indirect", "transitive"],
    "bitransitivo": "ditransitive",
    "reflexivo": "reflexive",
    "auxiliar": "auxiliary",
    "impessoal": "impersonal",
    "predicativo": "predicative",
    "com valor de verbo": "verb",
    "de lugar": "place",
    # "de modo": "",
    # "de tempo": "",
    # "de intensidade": "",
    "maiúscula": "capitalized",
    "minúscula": "lowercase",
}

TABLE_TAGS = {
    # Predefinição:flex.pt
    "Masculino": "masculine",
    "Feminino": "feminine",
    "Plural": "plural",
    "Singular": "singular",
    # Predefinição:flex.pt.subst.completa
    "Coletivo": "collective",
    "Normal": "standard",
    "Aumentativo": "augmentative",
    "Diminutivo": "diminutive",
    # Predefinição:conj.pt
    "Infinitivo impessoal": ["impersonal", "infinitive"],
    "Gerúndio": "gerund",
    "Particípio": "participle",
    "primeira": "first-person",
    "segunda": "second-person",
    "terceira": "third-person",
    "Modo\nIndicativo": "indicative",
    "Presente": "present",
    "Pretérito imperfeito": ["past", "continuative"],
    "Pretérito perfeito": "past",
    "Pretérito mais-que-perfeito": "pluperfect",
    "Futuro do presente": ["future", "present"],
    "Futuro do pretérito": ["future", "past"],
    "Modo\nSubjuntivo\n(Conjuntivo)": ["subjunctive", "conjunctive"],
    "Futuro": "future",
    "Modo\nImperativo": "imperative",
    "Afirmativo": "affirmative",
    "Negativo": "negative",
    "Infinitivo pessoal": ["personal", "infinitive"],
    # Predefinição:conj.en
    "Infinitivo": "infinitive",
    "Passado simples": "past",
}

# https://pt.wiktionary.org/wiki/Predefinição:escopo/núcleo
GLOSS_TAGS = {
    "Grafia portuguesa": "Portugal",
    "Grafia brasileira": "Brazil",
    "histórico": "historical",
    "antigo": "archaic",
    "arcaico": "archaic",
    "em desuso": "obsolete",
    "obsoleto": "obsolete",
    "pouco comum": "uncommon",
    "raro": "rare",
    "obsceno": "vulgar",
    "coloquial": "colloquial",
    "familiar": "familiar",
    "informal": "informal",
    # "popular": "",
    "figurado": "figuratively",
    "depreciativo": "derogatory",
    "pejorativo": "pejorative",
    "poético": "poetic",
    "internetês": ["Internet", "slang"],
    "ironia": "ironic",
    # "alemanismo": "",
    # "italianismo": "Italianism",
    # "germanismo": "Germanism",
    # "francesismo": "",
    # "galicismo": "Gallicism",
    "anglicismo": "Anglicism",
    # "portuguesismo": "Portuguesism",
    # "estrangeirismo": "loanword",
    "regionalism": "regional",
    "Angola": "Angola",
    "Brasil": "Brazil",
    # "Amazônia": "Amazonia",
    "Nordeste do Brasil": "Northeast-Brazil",
    "Norte do Brasil": "North-Brazil",
    "Centro-Oeste do Brasil": "Central-West-Brazil",
    "Sudeste do Brasil": "Southeast-Brazil",
    "Sul do Brasil": "Southern-Brazil",
    "Acre": "Acre",
    "Alagoas": "Alagoas",
    "Amapá": "Amapá",
    "Amazonas": "Amazonas",
    "Bahia": "Bahia",
    "dialeto caipira": "dialectal",
    "Ceará": "Ceará",
    # "Distrito Federal": "Federal District",
    "Espírito Santo": "Espírito Santo",
    "Goiás": "Goias",
    "Maranhão": "Maranhão",
    "Mato Grosso": "Mato Grosso",
    "Mato Grosso do Sul": "Mato Grosso do Sul",
    "Minas Gerais": "Minas Gerais",
    "Pará": "Pará",
    "Paraíba": "Paraíba",
    "Paraná": "Paraná",
    "Pernambuco": "Pernambuco",
    "Piauí": "Piauí",
    "Rio de Janeiro": "Rio de Janeiro",
    "Rio Grande do Norte": "Rio Grande do Norte",
    "Rio Grande do Sul": "Rio Grande do Sul",
    "Rondônia": "Rondônia",
    "Roraima": "Roraima",
    # "baralhete": "",
    # "canteiros": "",
    # "alvanéis": "",
    # "telheiros": "",
    # "músicos": "",
    # "cesteiros": "",
    "transitivo": "transitive",
    "intransitivo": "intransitive",
    "reflexivo": "reflexive",
    "pronominal": "pronominal",
    "plural": "plural",
    "Portugal": "Portugal",
    "grafia brasileira": "Brazilian",
    "grafia portuguesa": "Portuguese",
    "grafia lusitana": "Lusitanian",
}

OTHER_TAGS = {
    "comparativo de superioridade": ["comparative", "superior"],
    "superlativo absoluto sintético": ["absolute", "superlative"],
    "superlativo relativo de superioridade": [
        "relative",
        "superlative",
        "superior",
    ],
    "Gentílico": "demonym",
    "Galiza": "Galicia",
    "popular": "popular",
    "Romanização": "romanization",
    "X-SAMPA": "X-SAMPA",
    "AFI": "IPA",
}

TAGS = {**HEAD_LINE_TAGS, **TABLE_TAGS, **GLOSS_TAGS, **OTHER_TAGS}

# https://pt.wiktionary.org/wiki/Predefinição:escopo/núcleo
TOPICS = {
    "anatomia": "anatomy",
    "arquitetura": "architecture",
    "botânica": "botany",
    "ciência da computação": "computing",
    "comunicação": "communications",
    # "ciência dos materiais": "",
    "engenharia": "engineering",
    # "pedagogia": "pedagogy",
    # "cronônimo": "chrononym",
    "basquetebol": "basketball",
    "beisebol": "baseball",
    "críquete": "cricket",
    "desporto": "sports",
    "esporte": "sports",
    "ténis": "tennis",
    "tênis": "tennis",
    "esgrima": "fencing",
    "geografia": "geography",
    # "toponímia": "",
    # "territory": "",
    "zoologia": "zoology",
    "ornitologia": "ornithology",
    # "artrópodes": "",
    "entomologia": "entomology",
    "ictiologia": "ichthyology",
    "veterinária": "veterinary",
    # "antropónimo": "",
    "alimentação": "food",
    "arte": "arts",
    "aeronáutica": "aeronautics",
    "aritmética": "arithmetic",
    "Meteorologia": "meteorology",
    "design": "design",
    "patologia": "pathology",
    "etnologia": "ethnology",
    "farmacologia": "pharmacology",
    "transporte": "transport",
    "Ginecologia": "gynecology",
    "linguística": "linguistics",
    "indústria têxtil": "textiles",
    "mídia": "media",
    "ciência da informação": "information-science",
    "ludologia": "ludology",
    "náutica": "nautical",
    "mitologia": "mythology",
    "mineralogia": "mineralogy",
    "mobiliário": "furniture",
    "numismática": "numismatics",
    # "Esoterismo": "",
    "profissão": "profession",
    # "parapsiquismo": "",
    "vestuário": "clothing",
    "direito": "law",
    "química": "chemistry",
    "videojogo": "video-games",
    "vídeo game": "video-games",
    "viticultura": "viticulture",
    "País": "country",
    "religião": "religion",
    "antropônimo": "anthroponym",
    "Cristianismo": "Christianity",
    "medicina": "medicine",
}


def translate_raw_tags(data: WordEntry) -> None:
    raw_tags = []
    for raw_tag in data.raw_tags:
        if raw_tag in TAGS or raw_tag.lower() in TAGS:
            tr_tag = TAGS.get(raw_tag, TAGS.get(raw_tag.lower()))
            if isinstance(tr_tag, str):
                data.tags.append(tr_tag)
            elif isinstance(tr_tag, list):
                data.tags.extend(tr_tag)
        elif (raw_tag in TOPICS or raw_tag.lower() in TOPICS) and hasattr(
            data, "topics"
        ):
            data.topics.append(TOPICS.get(raw_tag, TOPICS.get(raw_tag.lower())))
        else:
            raw_tags.append(raw_tag)
    data.raw_tags = raw_tags
